<?php

class Paypal_Controller extends Controller {

	// This will demo a simple paypal transaction. It really only comes down to two steps.
	function __construct()
	{
		parent::__construct();

		$this->paypal = new Payment();
	}

	// This will set up the transaction and redirect the user to paypal to login
	function index()
	{
		require_once Kohana::find_file('vendors','paypal');
		$p = new paypal(true); 
		// setup a variable for this script (ie: 'http://www.ericbess.com/paypal.php')
		$this_script = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'];
		
		// if there is not action variable, set the default action of 'process'
		if (empty($_GET['action'])) $_GET['action'] = 'process';  
		
		$p->add_field('business', 'hs0714_1215608929_biz@163.com');
		$p->add_field('return', $this_script.'?action=success');
		$p->add_field('cancel_return', $this_script.'?action=cancel');
		$p->add_field('notify_url', $this_script.'?action=ipn');
		$p->add_field('item_name', 'Paypal Test Transaction');
		$p->add_field('amount', '1.99');
		
		switch ($_GET['action']) {
		    
		   case 'process':      // Process and order...
		
		      // There should be no output at this point.  To process the POST data,
		      // the submit_paypal_post() function will output all the HTML tags which
		      // contains a FORM which is submited instantaneously using the BODY onload
		      // attribute.  In other words, don't echo or printf anything when you're
		      // going to be calling the submit_paypal_post() function.
		 
		      // This is where you would have your form validation  and all that jazz.
		      // You would take your POST vars and load them into the class like below,
		      // only using the POST values instead of constant string expressions.
		 
		      $p->submit_paypal_post(); // submit the fields to paypal
		      $p->dump_fields();      // for debugging, output a table of all the fields
		      break;
		      
		   case 'success':      // Order was successful...
		   
		      // This is where you would probably want to thank the user for their order
		      // or what have you.  The order information at this point is in POST 
		      // variables.  However, you don't want to "process" the order until you
		      // get validation from the IPN.  That's where you would have the code to
		      // email an admin, update the database with payment status, activate a
		      // membership, etc.  
		 
		      echo "<html><head><title>Success</title></head><body><h3>Thank you for your order.</h3>";
		      foreach ($_POST as $key => $value) { echo "$key: $value<br>"; }
		      echo "</body></html>";
		      
		      // You could also simply re-direct them to another page, or your own 
		      // order status page which presents the user with the status of their
		      // order based on a database (which can be modified with the IPN code 
		      // below).
		      
		      break;
		      
		   case 'cancel':       // Order was canceled...
		
		      // The order was canceled before being completed.
		 
		      echo "<html><head><title>Canceled</title></head><body><h3>The order was canceled.</h3>";
		      echo "</body></html>";
		      
		      break;
		      
		   case 'ipn':          // Paypal is calling page for IPN validation...
		   
		      // It's important to remember that paypal calling this script.  There
		      // is no output here.  This is where you validate the IPN data and if it's
		      // valid, update your database to signify that the user has payed.  If
		      // you try and use an echo or printf function here it's not going to do you
		      // a bit of good.  This is on the "backend".  That is why, by default, the
		      // class logs all IPN data to a text file.
		      
		      if ($p->validate_ipn()) {
		          
		         // Payment has been recieved and IPN is verified.  This is where you
		         // update your database to activate or process the order, or setup
		         // the database with the user's order details, email an administrator,
		         // etc.  You can access a slew of information via the ipn_data() array.
		  
		         // Check the paypal documentation for specifics on what information
		         // is available in the IPN POST variables.  Basically, all the POST vars
		         // which paypal sends, which we send back for validation, are now stored
		         // in the ipn_data() array.
		  
		         // For this example, we'll just email ourselves ALL the data.
		         $subject = 'Instant Payment Notification - Recieved Payment';
		         $to = 'hs0714_1215609075_per@163.com';    //  your email
		         $body =  "An instant payment notification was successfully recieved\n";
		         $body .= "from ".$p->ipn_data['payer_email']." on ".date('m/d/Y');
		         $body .= " at ".date('g:i A')."\n\nDetails:\n";
		         
		         foreach ($p->ipn_data as $key => $value) { $body .= "\n$key: $value"; }
		         mail($to, $subject, $body);
		      } else {
		      	 $subject = 'Instant Payment Notification - Payment Fail';
		         $to = 'hs0714_1215609075_per@163.com';    //  your email
		         $body =  "An instant payment notification was failed, the fail reson is ".$p->ipn_status."\n";
		         mail($to, $subject, $body);
		    	}
		      break;
		 }   
		//$this->paypal->amount = 5;
		//$this->paypal->process();
	}

	// Once the user logs in, paypal redirects them here (set in the config file), which processes the payment
	function return_test()
	{
		$this->paypal->amount = 5;
		$this->paypment->payerid = $this->input->get('payerid'); 
		echo ($this->paypal->process()) ? "WORKED" : "FAILED";
	}

	// This is the cancel URL (set from the config file)
	function cancel_test()
	{
		echo 'cancelled';
	}

	// Just some utility functions.
	function reset_session()
	{
		$this->session->destroy();
		url::redirect('paypal/index');
	}

	function session_status()
	{
		echo '<pre>'.print_r($this->session->get(), true);
	}
}